#include <cstring>
#include "meny.h"
#include "video.h"
#include "game.h"
#include "net.h"

Meny* meny = NULL;

/*---------------------------------

Meny::Meny( void )
Konstruktor.

---------------------------------*/

Meny::Meny( void ) : ip_len(0), ip_at(0) {
	if( meny ) delete meny; meny = this;
}

/*---------------------------------

void Meny::startMeny( void )
Ritar menyn i början av spelet, och sköter den.

---------------------------------*/

void Meny::startMeny( void ) {
	bool aktivMeny = 1;

	// Svart bakgrund
	video.ritaRektangel( 0, 0, 640, 480, SVART_FARG );

	// Texter
	const char* valkommen = "Välkommen till Schack of DOOM (v 0.9)";
	const char* nyttSpel = "Spela nytt spel";
	const char* laddaSpel = "Ladda ett spel";
	const char* hosta = "Hosta ett spel (VIT / SVART)";
	const char* connecta = "Connecta till ett spel";

	// Rendera texten
	video.renderText( valkommen, 30, 30, VIT_TEXT );
	video.renderText( nyttSpel, 70, 140, VIT_TEXT );
	video.renderText( laddaSpel, 70, 190, VIT_TEXT );
	video.renderText( hosta, 70, 240, VIT_TEXT );
	video.renderText( connecta, 70, 290, VIT_TEXT );
	video.flip();

	// Ta input till menyn
	while( aktivMeny ) {
		SDL_Event event;
		SDL_WaitEvent( &event );

		switch( event.type ) {
			case SDL_VIDEOEXPOSE:
				video.flip();
				break;

			case SDL_QUIT:
				aktivMeny = false;
				exit(0);
				break;

			case SDL_MOUSEBUTTONDOWN:
				// Om man klickar på något bra så är menyn inte aktiv längre.
				if( meny->startMenyKlick( event.button.x, event.button.y ) == 1 ) {
					aktivMeny = false;
				}
				break;

			case SDL_KEYDOWN: {
				if( event.key.keysym.sym == SDLK_LEFT ) {
					if( ip_at > 0){
						ip_at--;
						renderIp();
					}
				}
				else if( event.key.keysym.sym == SDLK_RIGHT ) {
					if( ip_at < ip_len ){
						ip_at++;
						renderIp();
					}
				}
				else if( event.key.keysym.sym == SDLK_BACKSPACE && ip_at > 0 ) {
					memmove( &ip[ip_at-1], &ip[ip_at], ip_len-ip_at+1 );
					ip_len--, ip_at--;
					renderIp();
				}
				else if( ip_len < 15 && ((event.key.keysym.sym >= SDLK_a && event.key.keysym.sym <= SDLK_z) || event.key.keysym.sym == SDLK_PERIOD || event.key.keysym.sym == SDLK_UNDERSCORE || event.key.keysym.sym == SDLK_MINUS || (event.key.keysym.sym >= SDLK_0 && event.key.keysym.sym <= SDLK_9) ) ) {
					memmove( &ip[ip_at+1], &ip[ip_at], ip_len-ip_at+1 );
					ip_len++;
					ip[ip_at++] = event.key.keysym.sym - SDLK_a + 'a';
					renderIp();
				}
				else if( ip_len > 0 && event.key.keysym.sym == SDLK_RETURN ) {
					video.ritaRektangel( 40, 425, 500, 30,  SVART_FARG );
					video.renderText( "Ansluter...", 40, 425, VIT_TEXT );
					video.flip();

					/*// Försök starta en klient som ansluter.
					startClient( ip, 1337 );

					// Om vi lyckas connecta, stäng ned menyn.
					if( network ) {
						new Game();
						aktivMeny = false;
					}
					// Annars blir det sadface och menyn är kvar.
					else {
						SDL_Delay( 200 );
						video.ritaRektangel( 40, 425, 125, 30, SVART_FARG );
						video.flip();
						video.renderText( "Kunde inte ansluta...", 40, 425, VIT_TEXT );
						video.flip();
					}*/
					new Internet( strcmp( ip, "min" ) == 0 ? "min" : "din", strcmp( ip, "min" ) == 0 ? "din" : "min" );
					new Game();
					aktivMeny = false;
				}
				break;
			}
		}

	}

}

/*---------------------------------

void Meny::startServer( unsigned short port )
Skapar en server

---------------------------------*/

void Meny::startServer( unsigned short port ) {
	new Network( SERVER, port );
}

/*---------------------------------

void Meny::startClient( const char* remoteIp, unsigned short port )
Skapar en klient

---------------------------------*/

void Meny::startClient( const char* remoteIp, unsigned short port ) {
	new Network( CLIENT, port, remoteIp );
}

/*---------------------------------

void Meny::renderRuta( void )
Ritar rutan som ip:t skrivs i.

---------------------------------*/

void Meny::renderRuta( void ) {
	video.ritaRektangel( 30, 390, 500, 32, VIT_FARG );
	video.ritaRektangel( 31, 391, 498, 30, SVART_FARG );
}

/*---------------------------------

void Meny::renderIp( void )
Ritar ip:t när man ändrar i det när man ska connecta.

---------------------------------*/

void Meny::renderIp( void ) {
	int w = 0;
	renderRuta();

	if( ip_at > 0 ){
		char ip_liten[16];
		for( int i=0; i<ip_at; i++ ) ip_liten[i] = ip[i];
		ip_liten[ip_at] = '\0';
		w = video.renderText( ip_liten, 33, 390, VIT_TEXT );
	}
	video.ritaRektangel( 33+w, 393, 1, 26, VIT_FARG );
	if( ip_len > 0 ) {
		video.renderText( ip, 33, 390, VIT_TEXT );
	}
	video.flip();
}

/*---------------------------------

bool Meny::startMenyKlick( short x, short y )
Sköter klickandet på startmenyn.

---------------------------------*/

bool Meny::startMenyKlick( short x, short y ) {

	if( x >= 70 && x < 300 && y >= 140 && y < 190 ) {
		// Skapa helt nytt spel
		new Game();
		return 1;
	}
	else if( x >= 70 && x < 300 && y >= 190 && y < 240 ) {
		// Skapa spel från en gamelog
		std::ifstream gamelog("gamelog.txt");
		new Game( gamelog );
		gamelog.close();
		return 1;
	}
	else if( x >= 250 && x < 420 && y >= 240 && y < 290 ) {
		// Hosta ett spel
		video.ritaRektangel( 30, 360, 500, 100, SVART_FARG );
		video.renderText( "Väntar på att någon ska ansluta...", 30, 390, VIT_TEXT );
		video.flip();
		startServer( 1337 );
		Packet p;
		p.action = NYTT_SPEL;
		p.hostsFarg = ( x < 312 ? VIT : SVART );
		p.send();
		(new Game())->minFarg = p.hostsFarg;
		return 1;
	}
	else if( x >= 70 && x < 300 && y >= 290 && y < 340 ) {
		// Connecta till en host
		video.renderText( "Hostname/IP:", 30, 360, VIT_TEXT );
		ip[0] = 'l', ip[1] = 'o', ip[2] = 'c', ip[3] = 'a', ip[4] = 'l', ip[5] = 'h', ip[6] = 'o',
		ip[7] = 's', ip[8] = 't', ip[9] = '\0';
		ip_at = 9;
		ip_len = 9;
		renderIp();
		return 0;
	}

	return 0;
}

/*---------------------------------

Meny::~Meny()
Destruktor.

---------------------------------*/

Meny::~Meny() {
	meny = NULL;
}
